package controller;

import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.PushRegistry;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.wireless.messaging.MessageConnection;

import view.TelaAlarme;
import view.TelaMensagem;

public class CelularSystem extends MIDlet implements Runnable, CommandListener
{
	private Display display;
	private MessageConnection mc;
	
	private Thread thread;
	
	private String url;
	private String smsPort;
	
	public static final int DURATION = 60000;
	public static final int INTERVAL = 300000;
	public static final String NOME_APLICACAO = "Celular System";
	public static final String MENSAGEM_ROUBO = "CELULAR ROUBADO";
	public static final String MENSAGEM_MONITORANDO = "Seu celular está sendo monitorado.\nClique em ok para continuar a monitoração silenciosa.";
	
	
	private TelaMensagem telaMensagem;
	private TelaAlarme telaAlarme;
	
	public CelularSystem()
	{
		this.display = Display.getDisplay(this);
		this.url = "sms://:";
		this.smsPort = "50000";
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException
	{
		if(mc != null)
		{
			try
			{
				mc.close();
				
			} catch (IOException e)
			{
				System.out.println("ERRO: Falha ao fechar a conexao!");
			}
		}
	}

	protected void pauseApp()
	{
		
	}

	protected void startApp() throws MIDletStateChangeException
	{

		try
		{
			//Ainda nao registrado
			if(PushRegistry.listConnections(false).length == 0)
			{
				System.out.println("Registrating connection '" + this.url + this.smsPort + "'");
				PushRegistry.registerConnection(this.url + this.smsPort,this.getClass().getName(),"*");
	
				
				if(PushRegistry.listConnections(false) != null && PushRegistry.listConnections(false).length != 0)
				{
				
					System.out.println("Creating success message...");
					
					this.telaMensagem = new TelaMensagem(CelularSystem.NOME_APLICACAO,CelularSystem.MENSAGEM_MONITORANDO,true);
					this.telaMensagem.setCommandListener(this);
					
					System.out.println("Showing success message...");
					this.display.setCurrent(this.telaMensagem);
					
				}
				else
				{
					System.out.println("Creating fail message...");
					
					this.telaMensagem = new TelaMensagem(CelularSystem.NOME_APLICACAO,"Não foi possível registrar a conexão '" + url + smsPort + "'",true);
					this.telaMensagem.setCommandListener(this);
					
					System.out.println("Showing fail message...");
					this.display.setCurrent(this.telaMensagem);
				}
								
			}
			else if(PushRegistry.listConnections(true) != null && PushRegistry.listConnections(true).length != 0)
			{
				//Esta sendo chamado por uma chegada de sms
				
				
				System.out.println("Receveing data from the inbox...");
				this.mc = (MessageConnection) Connector.open(url + smsPort);
				this.mc.receive();
				this.mc.close();
				
				System.out.println("Starting alarm...");
				this.thread = new Thread(this);
				this.thread.start();
				
				
			}
			else if(PushRegistry.listConnections(false) != null && PushRegistry.listConnections(false).length != 0)
			{
				//Foi chamado manualmente depois de registrado
				
				this.telaMensagem = new TelaMensagem(CelularSystem.NOME_APLICACAO,CelularSystem.MENSAGEM_MONITORANDO,true);
				this.telaMensagem.setCommandListener(this);
				
				System.out.println("Showing message...");
				this.display.setCurrent(this.telaMensagem);
			}
			
		} catch (IOException e)
		{
			System.out.println("ERRO: Falha ao abrir a conexao '" + url + smsPort + "'!");
		} catch (ClassNotFoundException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 

	}

	public void run()
	{
		while(true)
		{
			System.out.println("Vibrando...");	
			this.display.vibrate(CelularSystem.DURATION);
			
			System.out.println("Piscando...");
			this.display.flashBacklight(CelularSystem.DURATION);
			
			System.out.println("Mensagem na tela...");
			this.telaAlarme = new TelaAlarme();
			this.display.setCurrent(this.telaAlarme);
			
			try
			{
				System.out.println("Display null...");
				this.display.setCurrent(null);
				
				System.out.println("Sleeping...zzz");
				Thread.sleep(CelularSystem.INTERVAL);
				
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		
	}

	public void commandAction(Command c, Displayable d)
	{
		
		if(c.getCommandType() == Command.EXIT )
		{
			System.out.println("Notifying destroyed...");
			notifyDestroyed();
		}
		
	}

}
